// Token时间验证工具
import { useAuthStore } from '@/store'

/**
 * 验证token是否过期（超过1小时）
 * @param tokenTimeString token时间字符串
 * @returns 是否有效（未过期返回true，过期返回false）
 */
export function validateTokenTime(tokenTimeString: string): boolean {
  try {
    // 解析token时间
    const tokenTime = new Date(tokenTimeString)
    const currentTime = new Date()
    
    // 计算时间差（毫秒）
    const timeDiff = currentTime.getTime() - tokenTime.getTime()
    
    // 1小时 = 60分钟 * 60秒 * 1000毫秒 = 3600000毫秒
    const oneHourInMs = 60 * 60 * 1000
    
    // 如果时间差小于1小时，则token有效
    const isValid = timeDiff < oneHourInMs
    
    console.log('🔐 Token验证信息:', {
      tokenTime: tokenTime.toLocaleString(),
      currentTime: currentTime.toLocaleString(),
      timeDiffMinutes: Math.floor(timeDiff / (1000 * 60)),
      isValid
    })
    
    return isValid
  } catch (error) {
    console.error('❌ Token时间解析失败:', error)
    return false // 解析失败视为过期
  }
}

/**
 * 检查并处理token过期
 * @param showMessage 是否显示消息提示，默认false（避免在路由守卫中使用）
 * @returns Promise<boolean> 返回token是否有效
 */
export async function checkAndHandleTokenExpiration(showMessage: boolean = false): Promise<boolean> {
  // 确保在客户端环境
  if (typeof window === 'undefined') {
    return true // SSR环境下直接返回true
  }

  const authStore = useAuthStore()
  
  // 如果没有token，直接返回false
  if (!authStore.token) {
    console.log('🔐 没有找到token')
    return false
  }
  
  // 验证token时间
  const isTokenValid = validateTokenTime(authStore.token)
  
  if (!isTokenValid) {
    console.log('⏰ Token已过期，清除登录状态')
    
    // 只在需要时显示过期提示
    if (showMessage && typeof window !== 'undefined') {
      try {
        const { useMessage } = await import('naive-ui')
        const message = useMessage()
        message.warning('登录已过期，请重新登录')
      } catch (error) {
        console.log('登录已过期，请重新登录')
      }
    }
    
    // 清除登录状态
    authStore.logout()
    
    return false
  }
  
  console.log('✅ Token验证通过')
  return true
}

/**
 * 获取token剩余有效时间（分钟）
 * @param tokenTimeString token时间字符串
 * @returns 剩余分钟数，如果已过期返回0
 */
export function getTokenRemainingTime(tokenTimeString: string): number {
  try {
    const tokenTime = new Date(tokenTimeString)
    const currentTime = new Date()
    
    const timeDiff = currentTime.getTime() - tokenTime.getTime()
    const oneHourInMs = 60 * 60 * 1000
    
    const remainingMs = oneHourInMs - timeDiff
    const remainingMinutes = Math.max(0, Math.floor(remainingMs / (1000 * 60)))
    
    return remainingMinutes
  } catch (error) {
    return 0
  }
}

/**
 * 格式化剩余时间显示
 * @param minutes 剩余分钟数
 * @returns 格式化的时间字符串
 */
export function formatRemainingTime(minutes: number): string {
  if (minutes <= 0) {
    return '已过期'
  } else if (minutes < 60) {
    return `${minutes}分钟`
  } else {
    const hours = Math.floor(minutes / 60)
    const mins = minutes % 60
    return `${hours}小时${mins}分钟`
  }
} 